/* 
 *  FileName: page179.c - 使用信号实现异步通知
 *
 *  Author: He Jingbo   jbhe@isoftstone.com
 *
 *  Date: Tue 11 Jan 2011 09:51:49 AM CST
 */

#include <stdio.h>
#include <fcntl.h>
#include <signal.h>
#include <unistd.h>
#include <linux/types.h>
#include <linux/stat.h>

#define MAX_LEN     100
void input_handler(int num)
{
    int len;
    char data[MAX_LEN];

    /* 读取并输出STDIN_FILENO(标准输入输出设备)上的输入 */
    len = read(STDIN_FILENO, &data, MAX_LEN);
    data[len] = 0;
    printf("input available: %s\n", data);
}

int main(int argc, char *argv[])
{
    int oflags;     /* 用于存放open()的flags */

    /* 启动信号驱动机制 */
    signal(SIGIO, input_handler);                   /* 设置信号响应函数 */
    fcntl(STDIN_FILENO, F_SETOWN, getpid());        /* 设置本进程为STDIN_FIFLNO的拥有这,这样,才能收到它发出的信号 */
    oflags = fcntl(STDIN_FILENO, F_GETFL);          /* 获取当前设备flags */
    fcntl(STDIN_FILENO, F_SETFL, oflags|FASYNC);    /* 为设备增加FASYNC,即异步通知模式 */

    /* 最后进入一个死循环,仅为保持进程不终止,
     * 不然,程序会立即执行完毕
    */
    while(1);

    return 0;
}
